/*
* ============================================================================
* 功能描述 ：串口命令层
* 作者       ：ggls
* 创建日期 ：2024.04.10
* ----------------------------------------------------------------------------
* 更新历史 ：
*	日期 　　- 修改者   : 更新内容描述
*
* ============================================================================
*/

#include "main.h"

static uart_buf_s uart_buf;
static void _uart_data_handle(void) {
    if (uart_buf.recv_buf[0] != 0x55) {
        uart_buf.recv_len = 0;
        return;
    }

    // 检查帧头
    if (uart_buf.recv_buf[1] != 0xAA) {
        uart_buf.recv_len = 0;
        return;
    }

    // 检查数据长度是否足够
    if (uart_buf.recv_len <= 7) {
        return;
    }

    // 计算实际数据长度（不包括校验位）
    unsigned char totalBytes = uart_buf.recv_buf[6] * 256 + uart_buf.recv_buf[7];
    uart_buf.cmd_len = totalBytes + 9; // 加上帧头、长度字段和校验位

    // 校验数据长度
    if (uart_buf.recv_len != uart_buf.cmd_len) {
        return;
    }

    // 校验数据
    unsigned char checksum = specialSumCheck(uart_buf.recv_buf, uart_buf.recv_len - 1);
    if (checksum != uart_buf.recv_buf[uart_buf.recv_len - 1]) {
        return;
    }

    // 数据校验通过，复制到cmd_buf并标记处理完成
    int i;
	for(i = 0; i < uart_buf.recv_len; i++)
	{
		uart_buf.cmd_buf[i] = uart_buf.recv_buf[i];
	}
    uart_buf.recv_hand_flag = true;
    uart_buf.recv_len = 0;
}

void uart_cmd_rx_cplt_callback(void)
{
	uart_buf.recv_buf[uart_buf.recv_len] = RCREG;
	uart_buf.recv_len++;
	RCIF = 0;
	if (uart_buf.recv_len >12)
		uart_buf.recv_len = 0;
	
	_uart_data_handle();
}

void uart_cmd_send_buf(unsigned char *buf, int length)
{
    while (length--) {
        while (!TRMT); // 等待发送寄存器空闲

        TXREG = *buf++;
    }

    // 添加一个额外的TRMT检查，确保数据完全发送
    while (!TRMT);
}


void Zigbee_Cmd_handle(void)
{
	if(uart_buf.recv_hand_flag == true)
	{
		
		uart_buf.recv_hand_flag = false;
		switch(uart_buf.cmd_buf[4])
		{
			case DEVICE_MANAGE:
				Zigbee_Device_Manage(uart_buf.cmd_buf, uart_buf.cmd_len);
				break;
			case NETWORK_MANAGE:
				Zigbee_Network_Manage(uart_buf.cmd_buf, uart_buf.cmd_len);
				break;
			case SERIAL_CONFIG_MANAGE:

				break;
			case OTA_MANAGE:

				break;
			case PRODUCT_MANAGE:

				break;
			default:
				break;

		}
	}

}



